package in.lib.adapter; import in.lib.Constants; import in.lib.manager.SettingsManager; import in.lib.utils.Dimension; import in.lib.view.JazzyViewPager; import in.lib.view.JazzyViewPager.TransitionEffect; import in.rob.client.R; import in.rob.client.base.RobinListFragment; import in.rob.client.page.base.StreamFragment; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import lombok.Getter; import lombok.Setter; import android.app.Activity; import android.content.Context; import android.content.res.Configuration; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.view.Window; import android.widget.TextView; @SuppressWarnings("rawtypes") public class PhonePageAdapter extends FragmentPagerAdapter implements OnPageChangeListener { private ArrayList<Class> classes; private ArrayList<Bundle> bundles; private final JazzyViewPager mViewPager; private final FragmentManager manager; private final Context mContext; private final List<String> mTitles; private OnPageChangeListener mOnPageChangeListener; @Getter @Setter private int index = 0; private ViewGroup mIndicator; private TextView mTitle, mTitle2; private final View mCustomView; private int mIndicatorViewWidth; public static LinkedHashMap<Class, Bundle> listToMap(List<Class> list) { LinkedHashMap<Class, Bundle> fragmentHash = new LinkedHashMap<Class, Bundle>(); for (Class c : list) { fragmentHash.put(c, null); } return fragmentHash; } @Override public Object instantiateItem(ViewGroup container, final int position) { Object obj = super.instantiateItem(container, position); mViewPager.setObjectForPosition(obj, position); return obj; } /** * Default constructor * * @param fm The fragment manager for all transactions * @param pager The viewpager tied with the adapter */ public PhonePageAdapter(Context ctx, FragmentManager fm, ViewPager pager, List<Class> fragments, View absCustomView) { this(ctx, fm, pager, listToMap(fragments), absCustomView); } @Override public float getPageWidth(int position) { if ((mContext.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE && (mContext.getResources().getConfiguration().orientation & Configuration.ORIENTATION_LANDSCAPE) == Configuration.ORIENTATION_LANDSCAPE && getCount() > 1 ) { return 0.5f; } return super.getPageWidth(position); } /** * Default constructor * * @param fm The fragment manager for all transactions * @param pager The viewpager tied with the adapter */ public PhonePageAdapter(Context ctx, FragmentManager fm, ViewPager pager, LinkedHashMap<Class, Bundle> fragments, View absCustomView) { super(fm); this.manager = fm; this.mContext = ctx; this.mViewPager = (JazzyViewPager)pager; this.mViewPager.setOnPageChangeListener(this); this.mCustomView = absCustomView; setPages(fragments); setAnimation(); updateViewIndicator(); if (mIndicator != null && this.classes.size() > 0) { switchPage(0); } else if (this.classes.size() < 1) { setIndicatorVisible(false); } mTitles = new ArrayList<String>(fragments.keySet().size()); Iterator<Class> i = fragments.keySet().iterator(); while (i.hasNext()) { mTitles.add(fragments.get(i.next()).getString(Constants.EXTRA_TITLE)); } } public void setAnimation() { if (((mContext.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE && (mContext.getResources().getConfiguration().orientation & Configuration.ORIENTATION_LANDSCAPE) == Configuration.ORIENTATION_LANDSCAPE && this.classes.size() > 1) || SettingsManager.getAllocatedMemory() < 16 || !SettingsManager.isPaginationAnimationEnabled()) { mViewPager.setTransitionEffect(TransitionEffect.Standard); } else { mViewPager.setTransitionEffect(TransitionEffect.Tablet); } } public void setPages(HashMap<Class, Bundle> fragments) { if (fragments.keySet().size() == fragments.values().size()) { classes = new ArrayList<Class>(fragments.keySet()); bundles = new ArrayList<Bundle>(fragments.values()); } else { classes = new ArrayList<Class>(fragments.keySet().size()); bundles = new ArrayList<Bundle>(fragments.keySet().size()); Iterator<Class> iterator = fragments.keySet().iterator(); while (iterator.hasNext()) { Class c = iterator.next(); classes.add(c); bundles.add(fragments.get(c) == null ? new Bundle() : fragments.get(c)); } } int count = this.classes.size(); if ((mContext.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE && (mContext.getResources().getConfiguration().orientation & Configuration.ORIENTATION_LANDSCAPE) == Configuration.ORIENTATION_LANDSCAPE && count <= 2 ) { mViewPager.setPagingEnabled(false); } else { mViewPager.setPagingEnabled(true); } } public void updateViewIndicator() { if (mCustomView != null) { mTitle = (TextView)mCustomView.findViewById(R.id.title); mTitle2 = (TextView)mCustomView.findViewById(R.id.title2); mIndicator = (ViewGroup)((Activity)mContext).findViewById(R.id.indicator); mIndicator.removeAllViewsInLayout(); mIndicator.removeAllViews(); // if (this.index > this.classes.size() - 1) // { // this.index = this.classes.size() - 1; // } int count = this.classes.size(); if ((mContext.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE && (mContext.getResources().getConfiguration().orientation & Configuration.ORIENTATION_LANDSCAPE) == Configuration.ORIENTATION_LANDSCAPE && count > 1 ) { count = (int)Math.ceil(count / 2.0d); } View indicator = LayoutInflater.from(mContext).inflate(R.layout.action_bar_tab, mIndicator, false); Dimension d = new Dimension(mContext); int width = d.getScreenWidth() / count; indicator.setLayoutParams(new LayoutParams(width, LayoutParams.MATCH_PARENT)); mIndicator.addView(indicator); mIndicator.scrollTo(index * width, 0); mIndicatorViewWidth = width; } } public int getIndex() { return index; } /** * @param visible True to set the tab indicater, false to set it invisible */ public void setIndicatorVisible(boolean visible) { if (mIndicator != null) { mIndicator.setVisibility(visible ? View.VISIBLE : View.GONE); } } /** * @param title The new title of the activity */ public void setTitle(String title) { mTitle.setText(title); } /** * @param title The new title of the activity */ public void setTitle2(String title) { mTitle2.setText(title); } /** * Sets the on page change listener * @param l The new listener */ public void setOnPageChangeListener(OnPageChangeListener l) { mOnPageChangeListener = l; } @Override public int getCount() { return this.classes.size(); } @Override public Fragment getItem(int position) { Fragment f = Fragment.instantiate(mContext, this.classes.get(position).getName(), this.bundles.get(position)); return f; } /** * Gets the fragment at the current position. This * is <b>not</b> the same as {@link getItem(int)} as * it does not instantiate a new fragment on request. * * @param position The position to query * @return The fragment if found, or null */ public Fragment getItemAt(int position) { return manager.findFragmentByTag("android:switcher:" + mViewPager.getId() + ":" + position); } @Override public void onPageScrollStateChanged(int scrollState) { mIndicator.scrollTo(-(index * mIndicatorViewWidth), 0); if (mOnPageChangeListener != null) { mOnPageChangeListener.onPageScrollStateChanged(scrollState); } } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { int count = this.classes.size(); if ((mContext.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE && (mContext.getResources().getConfiguration().orientation & Configuration.ORIENTATION_LANDSCAPE) == Configuration.ORIENTATION_LANDSCAPE && count > 1 ) { count = (int)Math.ceil(count / 2.0d); } int targetOffset = positionOffsetPixels / count; mIndicator.scrollTo(-((mIndicatorViewWidth * position) + targetOffset), 0); // Call sublistener if (mOnPageChangeListener != null) { mOnPageChangeListener.onPageScrolled(position, positionOffset, positionOffsetPixels); } } /** * Called when the page is changed * @param index The index of the current fragment in view */ @Override public void onPageSelected(int index) { this.index = index; if (mOnPageChangeListener != null) { mOnPageChangeListener.onPageSelected(index); } if (mIndicator != null) { switchPage(index); } resetRefreshables(); setRefreshable(index); } /** * Hides all the refreshables for the non-visible fragments */ public void resetRefreshables() { for (int index = 0; index < getCount(); index++) { Fragment frag = getItemAt(index); if (frag instanceof RobinListFragment && ((RobinListFragment)frag).getRefreshHelper() != null) { ((RobinListFragment)frag).getRefreshHelper().hideHelper(); } } } /** * Shows the indeterminate refreshable for the specific * index * @param index */ public void setRefreshable(int index) { Fragment frag = getItemAt(index); if (frag instanceof RobinListFragment && ((RobinListFragment)frag).getRefreshHelper() != null) { ((RobinListFragment)frag).getRefreshHelper().showHelper(); } } /** * Switches the page to the requested index * @param index The index of the new page to display */ private void switchPage(int index) { mIndicator.scrollTo(-(index * mIndicatorViewWidth), 0); if ((mContext.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE && (mContext.getResources().getConfiguration().orientation & Configuration.ORIENTATION_LANDSCAPE) == Configuration.ORIENTATION_LANDSCAPE && this.classes.size() > 1) { index = (int)Math.ceil(index / 2.0d); if (index + 1 < this.bundles.size()) { mTitle2.setText(this.bundles.get(index + 1).getCharSequence("title")); mTitle2.setVisibility(View.VISIBLE); } mTitle.setText(this.bundles.get(index).getCharSequence("title")); } else { mTitle2.setVisibility(View.GONE); mTitle.setText(this.bundles.get(index).getCharSequence("title")); } } @Override public CharSequence getPageTitle(int position) { return mTitles.get(position).toUpperCase(); } /** * Gets the current fragment in view * * @return The current fragment */ public Fragment getCurrentFragment() { return getItemAt(index); } @Override public void notifyDataSetChanged() { super.notifyDataSetChanged(); updateViewIndicator(); } public void setTopScrollable(Window window) { if ((window.getDecorView().findViewById(R.id.title) != null)) { window.getDecorView().findViewById(R.id.title).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (getCurrentFragment() instanceof StreamFragment) { ((StreamFragment)getCurrentFragment()).scrollToTop(); } } }); window.getDecorView().findViewById(R.id.title2).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (getItemAt(getIndex() + 1) instanceof StreamFragment) { ((StreamFragment)getItemAt(getIndex() + 1)).scrollToTop(); } } }); } } }